﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Npgsql;
using Aeroporto.modelo;
using System.Collections;

namespace Aeroporto.bd
{
    class ReservaDAO : GenericDAO
    {
        /**
         * Atualiza os dados alterados nos TextEdit's 
         **/
        public bool update_dados(ReservaModel reserva)
        {
            try
            {
                string sql = "update reserva set nome = '" + reserva.Nome + "', valor = " + reserva.Valor.ToString().Replace(',', '.') + " where cod_reserva = " + reserva.Cod_reserva;
                Conexao.consulta(sql);
                return true;
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return false;
        }

        public DataTable lista_dados_novo(String tabela, string tabela2, string tabela3, string agencia)
        {
            try
            {
                string sql;
                //string sql = "select " + tabela + ".*, " + tabela2 + ".data_viagem, " + tabela2 + ".id_trecho, " + tabela3 + ".nome, " + tabela3 + ".valor, " + tabela3 + ".cod_reserva from " + tabela + ", " + tabela2 + ", " + tabela3 + " where " + tabela2 + ".fila = " + tabela + ".fila and " + tabela2 + ".numero = " + tabela + ".numero and " + tabela2 + ".cod_aeronave = " + tabela + ".cod_aeronave and " + tabela2 + ".cod_reserva = " + tabela3 + ".cod_reserva;";
                if (agencia == "AGENCIA")
                {
                    sql = "select a.*, d.data_viagem, d.id_trecho, r.nome, r.valor, r.cod_reserva from disponibiliza d, assento a, reserva r, trecho t where d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.cod_reserva=r.cod_reserva and d.id_trecho=t.id_trecho";
                }
                else
                {
                    sql = "select a.*, d.data_viagem, d.id_trecho, r.nome, r.valor, r.cod_reserva from disponibiliza d, assento a, reserva r, trecho t where t.sigla_comp='" + agencia + "' and d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.cod_reserva=r.cod_reserva and d.id_trecho=t.id_trecho";
                }
                //Arquivo.escrever(sql);
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_disponibiliza(string comp)
        {
            try
            {
                string sql;
                if (comp == "AGENCIA")
                {
                    sql = "select d.fila, d.numero, d.cod_aeronave, d.data_viagem, d.id_trecho , a.classe, d.cod_reserva from disponibiliza d, assento a, trecho t where d.fila = a.fila and d.numero = a.numero and d.cod_aeronave = a.cod_aeronave and d.cod_reserva is null and d.id_trecho = t.id_trecho";                    
                }
                else
                {
                    sql = "select d.fila, d.numero, d.cod_aeronave, d.data_viagem, d.id_trecho , a.classe, d.cod_reserva from disponibiliza d, assento a, trecho t where d.fila = a.fila and d.numero = a.numero and d.cod_aeronave = a.cod_aeronave and d.cod_reserva is null and d.id_trecho = t.id_trecho and t.sigla_comp = '" + comp + "'";
                }
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public NpgsqlDataReader lista_maxCodReserva()
        {
            try
            {
                string sql = "select max(cod_reserva+1) from reserva;";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataReader da = command.ExecuteReader();
                return da;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_assento_fila()
        {
            try
            {
                string sql = "select fila from assento group by fila order by fila ASC;";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_assento_numero()
        {
            try
            {
                string sql = "select numero from assento group by numero order by numero ASC;";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_assento_codAeronave(string comp)
        {
            try
            {
                string sql;
                if (comp != "AGENCIA")
                {
                    sql = "select d.cod_aeronave from assento a, trecho t, disponibiliza d where d.id_trecho = t.id_trecho and d.cod_aeronave=a.cod_aeronave and d.numero =a.numero and d.fila=a.fila and t.sigla_comp='" + comp + "' group by d.cod_aeronave order by cod_aeronave asc;";
                }
                else
                {
                    sql = "select cod_aeronave from assento group by cod_aeronave order by cod_aeronave asc;";
                }
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_disponibiliza_idTrecho()
        {
            try
            {
                string sql = "select id_trecho from disponibiliza group by id_trecho order by id_trecho asc;";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_nextval()
        {
            try
            {
                string sql = "select nextval('aeroporto_v4.reserva_seq_id') from reserva;";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public MyMessageBox excluir_tudo(int valores)
        {
            MyMessageBox mb = new MyMessageBox("Removido com sucesso", "OK");
            
                mb = excluir("update disponibiliza set cod_reserva = null where cod_reserva = "+valores+"; update auditoria_reservas set cod_reserva_atual = null where cod_reserva_atual = "+valores+"; delete from reserva where cod_reserva = "+valores+";");
                if (mb.String2 == "Erro não foi removido.:")
                {
                    return mb;
                }
            
            return mb;
        }

        public DataTable pesquisar2(string comp, string nome, int grid)
        {
            try
            {
                string sql="";
                //string sql = "select assento.*, disponibiliza.data_viagem, disponibiliza.id_trecho, reserva.nome, reserva.valor, reserva.cod_reserva from assento, disponibiliza, reserva  where upper(" + coluna + ") like '%" + nome.ToUpper() + "%' and reserva.cod_reserva = disponibiliza.cod_reserva and disponibiliza.fila = assento.fila and disponibiliza.numero = assento.numero and disponibiliza.cod_aeronave = assento.cod_aeronave and ";                
                
                if (grid == 1)
                    if(nome.Contains("/"))
                        sql = "select a.*, d.data_viagem, d.id_trecho, r.nome, r.valor, r.cod_reserva from disponibiliza d, assento a, reserva r, trecho t where d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.cod_reserva=r.cod_reserva and d.id_trecho=t.id_trecho and d.data_viagem = '" + nome + "'";
                    else
                        sql = "select a.*, d.data_viagem, d.id_trecho, r.nome, r.valor, r.cod_reserva from disponibiliza d, assento a, reserva r, trecho t where d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.cod_reserva=r.cod_reserva and d.id_trecho=t.id_trecho and upper(r.nome) like '%" + nome.ToUpper() + "%'";
                else
                    if (grid == 2)
                        if (nome.Contains("/"))
                            sql = "select a.*, d.data_viagem, d.id_trecho from disponibiliza d, trecho t, assento a where d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.id_trecho=t.id_trecho and d.data_viagem = '" + nome + "'";
                        else
                            sql = "select a.*, d.data_viagem, d.id_trecho from disponibiliza d, trecho t, assento a where d.fila=a.fila and d.numero=a.numero and d.cod_aeronave=a.cod_aeronave and d.id_trecho=t.id_trecho and upper(r.nome) like '%" + nome.ToUpper() + "%'";
                
                if (comp != "AGENCIA")
                    sql += "and t.sigla_comp='" + comp + "' ";

                Arquivo.escrever(sql);
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        internal void cancela_reserva(string cod_reserva)
        {
            try
            {                
                string sql = "update disponibiliza set cod_reserva = null where cod_reserva = "+cod_reserva;
                Arquivo.escrever(sql);
                Conexao.consulta(sql);
                sql = "delete from reserva where cod_reserva = " + cod_reserva;
                Arquivo.escrever(sql);
                Conexao.consulta(sql);
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

        public DataTable lista_dados_disponibiliza_codAeronave_comCodigo(String cod_aeronave, int grid_ativo, string comp)
        {
            try
            {
                string sql = "";
                if (grid_ativo == 1)
                    sql = "select a.classe, d.*, r.nome, r.valor from disponibiliza d, reserva r, assento a, instancia i, trecho t where d.fila = a.fila and d.numero = a.numero and d.cod_aeronave = a.cod_aeronave and r.cod_reserva = d.cod_reserva and d.cod_aeronave ='" + cod_aeronave + "' and d.id_trecho = i.id_trecho and d.data_viagem = i.data_viagem and i.id_trecho = t.id_trecho and t.sigla_comp = '"+comp+"'";
                else if (grid_ativo == 2)
                    sql = "select a.classe, d.* from disponibiliza d, assento a, instancia i, trecho t where d.fila = a.fila and d.numero = a.numero and d.cod_aeronave = a.cod_aeronave and d.cod_aeronave ='" + cod_aeronave + "' and d.id_trecho = i.id_trecho and d.data_viagem = i.data_viagem and i.id_trecho = t.id_trecho and t.sigla_comp = '" + comp + "'";
                //string sql = "select a.classe, d.*, r.nome, r.valor from disponibiliza d, reserva r, assento a where d.fila = a.fila and d.numero = a.numero and d.cod_aeronave = a.cod_aeronave and r.cod_reserva = d.cod_reserva and d.cod_aeronave ='"+cod_aeronave+"'";
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }
    }
}
